package code.ws_common_scene.command
{
	import code.ws_common_scene.manager.SceneManager;
	
 	use namespace je_command_callfn;
	
	/**
	 * 主角英雄操作指令管理器
	 * @author qiangchen
	 * 
	 */	
	public class HeroCommandDevice
	{
		private static var _instance:HeroCommandDevice = null;
		/** 上一个指令 */
		private var prevCommand:Command = null;
		
		
		/**
		 * 构造函数 
		 * 
		 */		
		public function HeroCommandDevice()
		{
			if( _instance )
			{
				throw new Error("HeroCommandManager--->(Error): 此类对象应为唯一。");
				return;
			}
			
			_instance = this;
			ini();
		}
		
		
		/**
		 * 创建唯一实例对象 
		 * @return 
		 * 
		 */		
		public static function get instance():HeroCommandDevice
		{
			return _instance ||= new HeroCommandDevice();
		}
		
		
		/**
		 * 初始化 
		 * 
		 */		
		private function ini():void
		{
		}
		
		
		
		/*-----------------------public function-------------------------*/
		
		/**
		 * 指令 
		 * @param command 指令（如果为null，强制关闭当前指令，原地待机；如果不为null，取消上一次指令，进行当前指令）
		 * @param isCall 在更新指令时，是否允许上一次指令做后续事件（回调方法）。默认false：不允许
		 */		
		public function updataCommand( command:Command, isCall:Boolean=false ):void
		{
			// 如果参数为null，强制关闭当前的指令，原地待机
			if( command == null )
			{
				disposePrevCommand();
				SceneManager.instance.scene.hero.stand();
				return;
			}
			
			// 指令参数不为空，取消上一次指令进行当前指令
			( isCall ) ? cancelPrevCommand() : disposePrevCommand();
		
			// 执行指令
			prevCommand = command;
			prevCommand.setInnerCallFn( innerCallFn );
			prevCommand.execute();
			
			command = null;
		}
		
		/**
		 * 用于指令服务内部的对象引用清除工作 
		 * 
		 */		
		private function innerCallFn():void
		{
			disposePrevCommand();
		}
		
		
		/**
		 * 释放上一次指令（强行关闭，不执行后续事件） 
		 * 
		 */		
		private function disposePrevCommand():void
		{
			if( prevCommand )
			{
				prevCommand.dispose();
				prevCommand = null;
			}
		}
		
		
		/**
		 * 取消上一次指令（此方法在over时，会根据是否允许启动回调方法和回调方法两个参数进行触发） 
		 * 
		 */		
		private function cancelPrevCommand():void
		{
			if( prevCommand )
			{
				prevCommand.over();
				prevCommand = null;
			}
		}
		
		
		/**
		 * 获取当前指令 
		 * @return 
		 * 
		 */		
		public function get crtCommand():Command
		{
			return prevCommand;
		}
	}
}